/*Universidad el Valle de Guatemala
 * Hoja de Trabajo 4
 * 
 * Carlos Sagastume, 12113
 * Rodimiro Castañeda, 12122
 * 
 * 
 * Juan Fernando Moraflores 
 * 
 * Descripcion:
 *  Programa que permite al usuario ingresar la direccion de un archivo .txt
 * que contenga una operacion postfix y esta es resulta por medio de la utilizacion
 * ya sea de listas, arraylist o vectores.
 */
package Stack;

public class ListaCircular<E> implements iStack<E> {
    // atributos de la lista
    NodoListaSimple<E> Primero;
    NodoListaSimple<E> Ultimo;
    NodoListaSimple<E> objetop;
    iStack<E> stack;
    int tamaño;
    // constructor
    public ListaCircular()
    {
        Primero = Ultimo = null;
    }
    // metodo que indica si la lista esta vacia
    // si esta vacia devuelve true si tiene objetos devuelve false
    @Override
    public boolean empty()
    {
        if (Primero == null)
        {
            return true;
        }
        else 
        {
            return false;
        }
    }
    
    // metodo para insertar por el frente
    @Override
    public void push(E Objeto)
    {
        tamaño++;
        if (empty())
        {
            Primero = Ultimo = new NodoListaSimple(Objeto, null);
        }
        else
        {
            Ultimo.setSig(Primero);
            Primero = new NodoListaSimple(Objeto, Ultimo);
            Ultimo = Primero;
        }
    }
    // metodo para agregar un elemento al final
    public void alfinal(E Objeto)
    {
        tamaño++;
        if(empty())
        {
            Primero = Ultimo = new NodoListaSimple(Objeto, null);
        }
        else
        {
            Primero = Ultimo;
            Ultimo = new NodoListaSimple(Objeto, null);
        }
    }
    
    //Metodo para mostrar los datos de la lista
    public void Mostrar()
    {
        NodoListaSimple actual = Primero;
        if(empty())
        {
            System.out.println("La Lista se encuentra Vacia");
        }
        else
        {
            while(actual != null)
            {
                System.out.println(String.valueOf(actual.Dato));
                actual = actual.sig;
            }
        }
    }

// metodo para eliminar los elementos de la lista
    public E ElminarLista()
    {
        tamaño = tamaño -1;
        if(empty())
        {
            Primero = Primero.sig;
            return (E)Primero;
        }
        else if(Primero.equals(Ultimo))
        {
            Primero = Ultimo = null;
            return (E)Primero;
        }
        else 
        {
            Primero = Primero.sig;
            return (E)Primero;
        }
    }
// metodo para eliminar el ultimo de la lista
    @Override
    public E pop()
    {
        
        tamaño = tamaño-1;
        if(empty())
        {
            objetop = Primero;
            Primero = Primero.sig;
            return (E)objetop;
        }
        else if(Primero.equals(null))
        {
            objetop = Ultimo;
            Ultimo = null;
            return (E)objetop;
        }
        else
        {
            objetop = Primero;
            Primero = Primero.sig;
            return (E)objetop;
        }
}
    // metodo que devuelve el tamaño de la lista
    @Override
    public int size()
    {
        return tamaño;
    }
    // metodo que devuelve el primero de la lista
    @Override
    public E peek()
    {
        return (E)Primero;
    } 
}
